﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Security.Cryptography;
using System.Text;
using System.Threading.Tasks;

namespace BoxDiary
{
    class AES
    {
        public enum enmKeyBit
        {
            KeyBit128 = 128,
            KeyBit192 = 192,
            KeyBit256 = 256,
        }

        public class EncryptNew
        {
            /// <summary>
            /// AES ECB模式 加密
            /// </summary>
            /// <param name="data">明文</param>
            /// <param name="key">密钥</param>
            /// <param name="keyBit">密钥位数</param>
            /// <returns></returns>
            public static string AESEncrypt(String data, String key, enmKeyBit keyBit = enmKeyBit.KeyBit256)
            {
                if (string.IsNullOrEmpty(data))
                {
                    return string.Empty;
                }

                try
                {
                    int intKeyBit = (int)keyBit;
                    RijndaelManaged aes = new RijndaelManaged();
                    byte[] bytsData = Encoding.UTF8.GetBytes(data);
                    byte[] bytsKey = new Byte[intKeyBit / 8];
                    Array.Copy(Encoding.UTF8.GetBytes(key.PadRight(bytsKey.Length)), bytsKey, bytsKey.Length);

                    aes.Mode = CipherMode.ECB;
                    aes.Padding = PaddingMode.PKCS7;
                    aes.KeySize = intKeyBit;
                    aes.Key = bytsKey;
                    //aes.IV = iv;
                    ICryptoTransform ctf = aes.CreateEncryptor();
                    byte[] bytsResult = ctf.TransformFinalBlock(bytsData, 0, bytsData.Length);

                    return Convert.ToBase64String(bytsResult);
                }
                catch
                {
                    return string.Empty;
                }
            }

            /// <summary>
            /// AES ECB模式 解密
            /// </summary>
            /// <param name="data">密文</param>
            /// <param name="key">密钥</param>
            /// <param name="keyBit">密钥位数</param>
            /// <returns></returns>
            public static string AESDecrypt(String data, String key, enmKeyBit keyBit = enmKeyBit.KeyBit256)
            {
                if (string.IsNullOrEmpty(data))
                {
                    return string.Empty;
                }

                try
                {
                    int intKeyBit = (int)keyBit;
                    RijndaelManaged aes = new RijndaelManaged();
                    byte[] bytsData = Convert.FromBase64String(data);
                    byte[] bytsKey = new Byte[intKeyBit / 8];
                    Array.Copy(Encoding.UTF8.GetBytes(key.PadRight(bytsKey.Length)), bytsKey, bytsKey.Length);

                    aes.Mode = CipherMode.ECB;
                    aes.Padding = PaddingMode.PKCS7;
                    aes.KeySize = intKeyBit;
                    aes.Key = bytsKey;
                    //aes.IV = iv;

                    ICryptoTransform ctf = aes.CreateDecryptor();
                    byte[] bytsResult = ctf.TransformFinalBlock(bytsData, 0, bytsData.Length);

                    return UTF8Encoding.UTF8.GetString(bytsResult);
                }
                catch(Exception ex)
                {
                    throw (ex);
                }
            }
        }
    }
}
